danielino (Normal User)
Newbie
Messaggi: 6
Iscritto: 17/03/2010
|
Buongiorno a tutti,
sto programmando in vb.net e, in un gioco utilizzante directX 10, per ricevere l'input da tastiera uso il seguente codice:
Codice sorgente - presumibilmente VB.NET |
Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown Select Case e.KeyCode Case Keys.D1 'codice da eseguire quando si preme 1 Case Keys.D2 'codice da eseguire quando si preme 2 Case Keys.D3 'codice da eseguire quando si preme 3 Case Keys.D4 'codice da eseguire quando si preme 4 End Select End Sub
|
Il codice funziona e non da errori...
Il problema sta che, se io premo più tasti insieme, ad esempio 1 e 2, mi esegue solo il codice del tasto 1.
Questo credo accada perché e.KeyCode assume un solo valore che viene poi confrontato con ogni Case del Select.
Come posso fare per leggere più tasti premuti in contemporanea e eseguire i relativi codici???
grz
|
|
Federico_VbNet_Programmer (Normal User)
Expert
Messaggi: 222
Iscritto: 03/04/2010
|
Tu vuoi fare un keylogger che serva solo a leggere gli input del programma?
Perchè il codice che hai scrittto serve a quello,ma se vuoi fare un keylogger io non ti aiuterò,rileggi il regolamento se vuoi fare un keylogger per tutti i programmi.
Ma se vuoi fare un keylogger solo nel programma,devi prima scrivere nel programma che tutti i tasti premuti saranno scritti in qualche parte.
Se hai sritto che il programma scriverà da qualche parte i pulsanti che ha ricevuto in input,ti aiuterò con piacere.
|
|
danielino (Normal User)
Newbie
Messaggi: 6
Iscritto: 17/03/2010
|
io vorrei creare un gioco in cui un modello 3D premendo 1 vada in avanti, premendo 2 si sposti più a destra, premendo 3 vada dietro, premendo 4 vada a sinistra.
Non so cosa sia un KeyLogger, wikipedia dice "uno strumento in grado di intercettare tutto ciò che un utente digita sulla tastiera del proprio, o di un altro computer", e sicuro non è questo il mio intento.
Non so a ke serva scriversi tutti i tasti ke l'utente prema, in ogni caso basterebbe fare un array di char e ogni volta ke il keys corrisponde, ridimensionare l'array e aggiungerci il tasto premuto sotto forma di carattere in cima (per ki conosce il C una sorta di coda) e, se è questo il problema, per me non ce problema a realizzare l'array.
|
|
salva94 (Normal User)
Rookie
Messaggi: 57
Iscritto: 02/01/2010
|
Con l'evento keydown ho provato diverse volte anchio senza successo, per qquesto ti consiglio di utilizzare la libreria user32 , unico svantaggio : anche quando non hai selezionata la form cliccando quei tasti viene fatta la funzione che hai dato
Codice sorgente - presumibilmente VB.NET |
Public Declare Function GetAsyncKeyState Lib "user32" Alias "GetAsyncKeyState" (ByVal vKey As Keys) As Short Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick If GetAsyncKeyState(Keys.ControlKey) < 0 AndAlso GetAsyncKeyState(Keys.A) < 0 Then MsgBox("Sono stati premuti i tasti CTRL+A.") End If
|
|
|
netarrow (Admin)
Guru^2
Messaggi: 2502
Iscritto: 12/05/2004
|
al posto del Select-Case, prova a fare una serie di if senza else.
|
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
Postato originariamente da netarrow:
al posto del Select-Case, prova a fare una serie di if senza else. |
Non funzionerebbe comunque. Gli if sarebbero una soluzione se e.KeyCode contenesse più di un codice, ma dato che ne contiene solo uno equivalgono ad un select case. Il problema è che non ci sono due eventi per due tasti. |
|
HeDo (Founder Member)
Guru^2
Messaggi: 2765
Iscritto: 21/09/2007
|
so che forse stiamo sparando ad una formica con un bazooka, ma si potrebbe, tramite pinvoke, chiamare la funzione GetKeyboardState che copia in un array di byte lo stato corrente di tutti i tasti della tastiera. In questo modo non c'è il problema dei tasti sovrapposti in quanto non ti cambia nulla sui controlli che vuoi fare.
Un approcio carino sarebbe quello di metterla in un thread richiamandola a intervalli di tempo sufficientemente piccoli, si fa lo scan dei tasti premuti sull'array e si riempie una coda di eventi KeyDown. Un altro thread fa da dispatcher per gli eventi e chiama gli effettivi gestori di codice della GUI o di qualcos'altro.
Però secondo me in xna ci hanno già pensato...
|
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
Sì, infatti in XNA c'è questo metodo, Keyboard.GetState().GetPressedKeys(), che restituisce un array di valori enumeratori di tipo Keys i quali rappresentano i tasti premuti durante la chiamata della suddetta funzione.
Pensavo che il problema fosse risolto con il suggerimento di salva94.
|
|
Thejuster (Admin)
Guru^2
Messaggi: 2313
Iscritto: 04/05/2008
|
Ultima modifica effettuata da Il Totem il 26/04/2010 alle 17:50
|
|